/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hojano6;

/**
 *
 * @author Magaly
 */
public class Iterator<E extends Comparable<E>>  {
       //------------------------------------------------------------------------
    // Atributos
    //------------------------------------------------------------------------
    
    // raiz del subbÃ¡rbol.
    private BinaryTree<E> root;
    //Stack
    private Stack<BinaryTree<E>> todo;
    
    //------------------------------------------------------------------------
    // Constructor
    //------------------------------------------------------------------------
    
    public Iterator (BinaryTree<E> root) {
        todo = new StackArrayList<BinaryTree<E>>();
        this.root=root;
        reset();
    }
    
    //------------------------------------------------------------------------
    // MÃ©todos
    //------------------------------------------------------------------------
    
    /**
     * MÃ©todo que permite Resetear el iterador.
     * @pre: -
     * @post: Resetea el iterador. 
     */
    public void reset(){
        todo.clear();
        // La pila se encuentra vacia. Se da un push de los nodos 
        // desde la raiz para la parte izquierda.
        BinaryTree<E> current = root;
        while (current != ImplementacionBinaryT.EMPTY){
            todo.push(current);
            current = current.left();
        }
    }
    
    /**
     * MÃ©todo que permite saber si se ha terminado el iterador.
     * @pre: -
     * @post: Retorna verdadero si el iterador se ha terminado.
     * @return Verdadero si mÃ¡s nodos se deber considerar.
     */
    public boolean hasNext(){
        return !todo.empty();
    }
    
    /**
     * MÃ©todo que obtiene la referencia para el valor.
     * @pre: hasNext()
     * @post: Regresa la referencia del valor.
     * @return 
     */
    public E get(){
        return todo.peek().value();
    }
    
    /**
     * MÃ©todo que regresa el valor e incrementa el iterador.
     * @pre: hasNext()
     * @post: Regresa el valor e incrementa el iterador.
     * @return result
     */
    public E next(){
        BinaryTree<E> old = todo.pop();
        E result = old.value();
        // Si este nodo posee un hijo derecho, se le da un pusho para
        // el descendiente mÃ¡s izquierdo, sino el elemento del tope de
        // la pila es el siguiente nodo por visitar.
        if (!old.right().isEmpty()){
            BinaryTree<E> current = old.right();
            do{
                todo.push(current);
                current=current.left();
            }while(!current.isEmpty());
        }
        return result;
    }

     
}
